package cn.wonderland.org.service.impl;

import cn.wonderland.base.query.BaseQuery;
import cn.wonderland.base.service.impl.BaseServiceImpl;
import cn.wonderland.base.util.LoginContext;
import cn.wonderland.base.util.MD5Utils;
import cn.wonderland.base.util.PageList;
import cn.wonderland.base.util.StrUtils;
import cn.wonderland.org.domain.Employee;
import cn.wonderland.org.domain.Shop;
import cn.wonderland.org.mapper.EmployeeMapper;
import cn.wonderland.org.service.EmployeeService;
import cn.wonderland.org.vo.EmpAndRoleVo;
import cn.wonderland.system.domain.Role;
import cn.wonderland.system.mapper.RoleMapper;
import cn.wonderland.user.domain.Logininfo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.*;
import java.util.stream.Collectors;

@Service
public class EmployeeServiceImpl extends BaseServiceImpl<Employee> implements EmployeeService {

    @Autowired
    private RoleMapper roleMapper;
    @Autowired
    private EmployeeMapper employeeMapper;


    @Override
    public List<Employee> findByDeptId(Long deptId) {
        return employeeMapper.findByDeptId(deptId);
    }


    /**
     * 查询店铺下的 员工
     * @param shopId
     * @return
     */
    @Override
    public List<Employee> findListByShopId(Long shopId) {
        return super.findAll().stream()
                .filter(emp-> Objects.nonNull(emp.getShopId()) && emp.getShopId().equals(shopId))
                .collect(Collectors.toList());
    }

    @Override
    public void add(Employee emp) {
        // todo 下面都是为了数据权限实现
        //  密码
        String salt = StrUtils.getComplexRandomString(32);
        emp.setSalt(salt);
        emp.setPassword(MD5Utils.encrypByMd5(salt+"1"));
        // 添加logininfo
        Logininfo logininfo = new Logininfo();
        BeanUtils.copyProperties(emp,logininfo);
        logininfo.setDisable(1);
        logininfo.setType(0);
        // todo 添加emp的时候 需要判断一下 是否有店铺id
        Shop shop = LoginContext.getUserInfo().getShop();
        if (null != shop){
            // todo 当前操作人是店铺的人 那么添加的人应该也是店铺的人 那么给个店长的默认角色 其他角色一概不给
            emp.setShopId(shop.getId());
            super.add(emp);
            List<Role> roleList = roleMapper.findAll();
            Optional<Role> any = roleList.stream().filter(role -> "dz001".equals(role.getSn())).findAny();
            any.ifPresent(role->{
                roleMapper.addMiddle(emp.getId(), Collections.singletonList(role.getId()));
            });
        }else {
            // todo 否则就是添加正常平台员工
            super.add(emp);
            // 角色
            roleMapper.addMiddle(emp.getId(), emp.getRoles());
        }


    }

    @Override
    public void update(Employee emp) {
        super.update(emp);
        // 删除
        roleMapper.delByEmpId(emp.getId());
        // 角色
        roleMapper.addMiddle(emp.getId(), emp.getRoles());
    }

    @Override
    public PageList<Employee> queryByPage(BaseQuery query) {
        PageList<Employee> pageList = super.queryByPage(query);
        if (null == pageList || CollectionUtils.isEmpty(pageList.getRows())) {
            return pageList;
        }
        //  我们要干的事：现在要将 员工对应的 角色id集合 添加到对象中

        // 1.先去查询到所有的role 根据empid
        // 先去获取到所有的empid集合
        List<Employee> empList = pageList.getRows();
        List<Long> empIdList = empList.stream().map(Employee::getId).collect(Collectors.toList());
        // 根据 empIdList 去中间表中 查询 所有的roleId 集合
        List<EmpAndRoleVo> vos = roleMapper.findByEmpIds(empIdList);
        // 需要对vos 进行分组 返回一个map map的key：empId map的value：List<Long> roleIds
        Map<Long, List<Long>> voMap = vos.stream().collect(Collectors.groupingBy(EmpAndRoleVo::getEmployeeId
                , Collectors.mapping(EmpAndRoleVo::getRoleId, Collectors.toList())));

        empList.forEach(emp -> {
            List<Long> roleIds = voMap.get(emp.getId());
            emp.setRoles(roleIds);
        });
        return pageList;
    }
}